EasyExcel基本使用 | 您所在的位置:网站首页 › aspose 中文乱码 › EasyExcel基本使用 |
官网地址: EasyExcel 本文代码: EasyExcelDemo 在开发中Excel的导入导出是非常常见的需求,最近在项目中用到了阿里的EasyExcel,简单学习下,还是比较容易上手的。下面记录下 EasyExcel介绍EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 导入依赖 com.alibaba easyexcel 2.1.2 导出例如现在要导出如下Excel: 使用模型导出 使用模型导出时,EasyExcel会根据导出实体中 @ExcelProperty注解生成表头 模型注解说明 @HeadRowHeight:设置表头高度,作用域在类 @ExcelIgnoreUnannotated:忽略没有注解标记的字段,作用域在类 @ExcelIgnore:忽略指定的字段,作用域在字段 @ExcelProperty:指定导出列名和索引,作用域在字段 @ColumnWidth:设置列的宽度,作用域在字段 @NumberFormat:设置数值精度,作用域在字段,例:@NumberFormat(value = "#.00") @DateTimeFormat:格式化日期,作用域在字段,例:@DateTimeFormat(value = "yyyy-MM-dd") 建立模型 @Data @NoArgsConstructor @AllArgsConstructor @ColumnWidth(15) // 设置列宽 public class ExcelDemoDto { @ExcelProperty("字符串测试1") private String column1; @ExcelProperty("字符串测试2") private String column2; @ExcelProperty("数字测试") private BigDecimal number; @ExcelProperty("日期测试") @DateTimeFormat(value = "yyyy-MM-dd") private Date date; } 导出实现 public void easyWrite(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode防止中文乱码 String fileName = URLEncoder.encode("导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); ServletOutputStream outputStream = response.getOutputStream(); // 获取导出数据 List exportData = new ArrayList(); ExcelDemoDto excelDemoDto = new ExcelDemoDto("zjm","520", BigDecimal.valueOf(20),new Date()); exportData.add(excelDemoDto); // 初始化ExcelWriter ExcelWriter writer = EasyExcel.write(outputStream).build(); // 初始化一个sheet WriteSheet sheet1 = EasyExcel.writerSheet(0, "sheet1") .head(ExcelDemoDto.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .build();// EasyExcel自带的自动列宽拦截器 // 写入数据 生成Excel文件 try { writer.write(exportData, sheet1); } catch (Exception e) { log.info("导出失败: {}",e.getCause()); throw e; } finally { writer.finish(); } }不使用用模型导出 如果不使用模型,可以手动设置表头 public void easyWriteNoModel(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode防止中文乱码 String fileName = URLEncoder.encode("导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); ServletOutputStream outputStream = response.getOutputStream(); // 获取导出数据 List exportData = new ArrayList(); ExcelDemoDto excelDemoDto = new ExcelDemoDto("zjm","520", BigDecimal.valueOf(20),new Date()); exportData.add(excelDemoDto); // head List head = new ArrayList(); // 每一列都需要设置一个List List headColumn1 = Arrays.asList("字符串测试1"); List headColumn2 = Arrays.asList("字符串测试2"); List headColumn3 = Arrays.asList("数字测试"); List headColumn4 = Arrays.asList("日期测试"); head.add(headColumn1); head.add(headColumn2); head.add(headColumn3); head.add(headColumn4); // 初始化ExcelWriter ExcelWriter writer = EasyExcel.write(outputStream).build(); // 初始化一个sheet WriteSheet sheet1 = EasyExcel.writerSheet(0, "sheet1") .head(head) .build(); // 写入数据 生成Excel文件 try { writer.write(exportData, sheet1); } catch (Exception e) { log.info("导出失败: {}",e.getCause()); throw e; } finally { writer.finish(); } } 导入监听器实现 /** * 自定义监听器实现 * @param */ @Data @EqualsAndHashCode(callSuper = true) public class AnalysisEventListenerImpl extends AnalysisEventListener { private List datas = new ArrayList(); @Override public void invoke(E data, AnalysisContext context) { datas.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { } }读取工具类 EasyExcelUtil public static List readExcelByModel(MultipartFile file,Class clazz,int sheetNo,int headRowNumber) throws IOException { List list = new ArrayList(); InputStream inputStream = null; try { // 获取输入流 inputStream = file.getInputStream(); // 数据收集器 AnalysisEventListenerImpl listener = new AnalysisEventListenerImpl(); ExcelReader excelReader = EasyExcel.read(inputStream, listener).build(); // 第一个sheet读取类型 ReadSheet readSheet = EasyExcel.readSheet(sheetNo).head(clazz).headRowNumber(headRowNumber).build(); // 开始读取第一个sheet excelReader.read(readSheet); list = listener.getDatas(); } catch (IOException e) { // throw new RuntimeException("excel解析出错"); log.info("解析出错: " + e.getCause()); } finally { // 记得关流 if (inputStream != null) { inputStream.close(); } } return list; }导入实现 public List easyRead(MultipartFile file) throws Exception { try { List list = EasyExcelUtil.readExcelByModel(file, ExcelDemoDto.class); return list; } catch (IOException e) { throw new Exception("Excel解析出错"); } } 多sheet导出 public void multiSheetWrite(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode防止中文乱码 String fileName = URLEncoder.encode("导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); ServletOutputStream outputStream = response.getOutputStream(); // 获取导出数据 List exportData1 = new ArrayList(); ExcelDemoDto excelDemoDto = new ExcelDemoDto("zjm","520", BigDecimal.valueOf(20),new Date()); exportData1.add(excelDemoDto); // 初始化ExcelWriter ExcelWriter writer = EasyExcel.write(outputStream).build(); // 初始化一个sheet1 WriteSheet sheet1 = EasyExcel.writerSheet(0, "sheet1") .head(ExcelDemoDto.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .build();// EasyExcel自带的自动列宽拦截器 WriteSheet sheet2 = EasyExcel.writerSheet(1, "sheet2") .head(ExcelDemoDto.class) .build(); // 写入数据 生成Excel文件 try { writer.write(exportData1, sheet1); writer.write(exportData1, sheet2); } catch (Exception e) { log.info("导出失败: {}",e.getCause()); throw e; } finally { writer.finish(); } } 多sheet导入 public Map multiSheetRead(MultipartFile file) throws IOException { List list1 = EasyExcelUtil.readExcelByModel(file, ExcelDemoDto.class, 0, 1); List list2 = EasyExcelUtil.readExcelByModel(file, ExcelDemoDto.class, 1, 1); Map map = new HashMap(); map.put(0,list1); map.put(1,list2); return map; } 复杂表头导出在实际业务中,往往导入导出的Excel表头十分复杂,例如下面这样的 使用模型设置 @Data public class ExcelMultiHeadDemoDto { @ExcelProperty({ "序号","序号","序号","序号"}) private String no; @ExcelProperty({ "字段1","字段1","字段1","字段1"}) private String column1; @ExcelProperty({ "大标题1","大标题1-1","大标题1-1","大标题1-1"}) private String column2; @ExcelProperty({ "大标题1","大标题1-2","大标题1-2","大标题1-2"}) private String column3; @ExcelProperty({ "大标题1","大标题1-3","大标题1-3","大标题1-4"}) private BigDecimal column4; }效果如下 EasyExcel在解析数据时,默认表头为1,如多表头是多行,需要设置 rowHeadNumber参数,若不设置,EasyExcel会将表头也解析,在使用 模型读取时极有可能出现类型转换错误 public List multiHeadRead(MultipartFile file) { try { List list = EasyExcelUtil.readExcelByModel(file, ExcelMultiHeadDemoDto.class,0,4); return list; } catch (IOException e) { log.info("Excel解析出错"); } return null; } |
CopyRight 2018-2019 实验室设备网 版权所有 |